#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

/* 在结构体内，声明结构体得写完整，用不到外面的定义简写 */
typedef int ElemType;
typedef struct LNode{
    ElemType data;
    struct LNode *next;
}LNode, *LinkList;

bool initLinkList(LinkList L);
bool listInsert(LinkList L, int index, ElemType elem);
bool listDelete(LinkList L, int index, ElemType *elem);
bool insertNextNode(LNode *p, ElemType elem);
bool insertPriorNode(LNode *p, ElemType elem);
bool deleteNode(LNode *P);

int main(){
    LinkList L;
    int temp = -1;
    initLinkList(L);
    listInsert(L, 1, 100);
    printf("hand_node_data: %d\n", L->data);
    printf("first_node_data: %d\n", L->next->data);
    listDelete(L, 1, &temp);    //传入参数时，若参数是指针，则需要解指针后赋值。
    printf("%d\n", temp);
    return 0;
}

/* 链表结点必须得开辟一块地址才能使用，不可直接访问 */
bool initLinkList(LinkList L){
    //链表头指针指向一块新的储存空间（头结点）
    L = (LNode *)malloc(sizeof(LNode));
    if(L==NULL) return false;
    L->next = NULL;
    return true;
}

//后插
bool listInsert(LinkList L, int index, ElemType elem){
    if(index<1) return false;
    LNode *p;   //扫描节点
    int id = 0;
    p = L;  //将链表头指针给扫描结点（将扫描结点放到链表头）
    while(p!=NULL&&id<index-1){
        p = p->next;
        id++;
    }
    // if(p==NULL) return false;
    // temp->data = elem;
    // temp->next = p->next;
    // p->next = temp;
    // return true;
    insertNextNode(p, elem);
}

//指定结点后插
bool insertNextNode(LNode *p, ElemType elem){
    if(p==NULL) return false;
    LNode *temp = (LNode *)malloc(sizeof(LNode));
    if(temp==NULL) return false;
    temp->data = elem;
    temp->next = p->next;
    p->next = temp;
    return true;
}

//指定结点前插（依旧是后插，但是交换两结点数据）
bool insertPriorNode(LNode *p, ElemType elem){
    if(p==NULL) return false;
    LNode *temp = (LNode *)malloc(sizeof(LNode));
    if(temp==NULL) return false;
    temp->next = p->next;
    temp->data = p->data;
    p->data = elem;
    p->next = temp;
    return true;
}

bool listDelete(LinkList L, int index, ElemType *elem){
    if(index<1) return false;
    LNode *p;
    int id = 0;
    p = L;
    while(p!=NULL&&id<index-1){
        p = p->next;
        id++;
    }
    if(p==NULL||p->next==NULL) return false;
    *elem = p->next->data;
    deleteNode(p);
}

bool deleteNode(LNode *p){
    if(p==NULL||p->next==NULL) return false;
    LNode *q = p->next;
    p->next = q->next;
    free(q);
    return true;
}